<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 闭包的意义
        // 闭包函数的存在，延长了外部局部变量的声明周期
        // 1. js 如何知道闭包函数，用了哪些父函数的局部变量？
            // 不用知道，没有显示引用任何一个父级变量，一直都在。
            // 闭包保留全部父级变量，不论用没用
        // 2. js 如何确定 onclick 消失后要回收哪些变量？
        // 3， 父级的变量不回收，父级的父级？
            // 会一直沿着作用域链影响

        // let obj = {c:1};
        // function show() {
        //     let a = 12;
        //     let b = 5;
        //     document.onclick = function() {
        //         alert(eval(prompt("请随便输入一个表达式")));
        //     }
        // }
        // show();
        // setTimeout(()=> {
        //     document.onclick = null;
        //     obj = null;  // 手动垃圾回收
        // },5000)

        // 计数器
        // 垃圾回收的原理
        // js 依靠引用技术机制，确定一个东西是否能回收  
        let a = {name:'blue',age:18};  // a 引用了 json  引用+1
        let b = a;  // b 引用了json  引用 +1 = 2

        a = null;  // a 不再指向 json  引用-1 =1
        b = null;  // b 不再指向 json  引用-1 
        // json 回收
        // console.log(a);


        // 闭包 = 外部变量 + 函数
        function fn1() {
            let a=12;
            function fn2() {
                let b = 5;
                document.onclick=function() {

                }
            }
            fn2();
        }

        fn1();
    </script>
</body>
</html>